package com.zheng.cms.rocketmq.execute;


import com.alibaba.rocketmq.client.producer.LocalTransactionExecuter;
import com.alibaba.rocketmq.client.producer.LocalTransactionState;
import com.alibaba.rocketmq.common.message.Message;
/**
 * RocketMQ第一阶段发送Prepared消息时，会拿到消息的地址，第二阶段执行本地事物，第三阶段通过第一阶段拿到的地址去访问消息，并修改消息的状态。
 *
 * 细心的你可能又发现问题了，如果确认消息发送失败了怎么办？
 * RocketMQ会定期扫描消息集群中的事物消息，如果发现了Prepared消息，它会向消息发送端(生产者)确认，
 * Bob的钱到底是减了还是没减呢？如果减了是回滚还是继续发送确认消息呢？RocketMQ会根据发送端设置的策略来决定是回滚还是继续发送确认消息。
 * 这样就保证了消息发送与本地事务同时成功或同时失败。
 * */
public class TransactionExecuterImpl implements LocalTransactionExecuter {
    public LocalTransactionState executeLocalTransactionBranch(final Message msg, final Object arg) {

        System.out.println("执行本地事务msg = " + new String(msg.getBody()));

        System.out.println("执行本地事务arg = " + arg);

        String tags = msg.getTags();//message的flag没用到，可以用flag(消息标志，系统不做干预，完全由应用决定如何使用)这个属性

        if (tags.equals("transaction2")) {//模拟事务失败，其实事务并未失败 ，还是可以回滚
            //实际业务中怎么判断事务失败了
            System.out.println("======我的操作============，失败了  -进行ROLLBACK");
            return LocalTransactionState.ROLLBACK_MESSAGE;
        }
        return LocalTransactionState.COMMIT_MESSAGE;
        // return LocalTransactionState.UNKNOW;
    }
}
